/************************* 公共函数文件(会被加到 vue 实例上) *************************/
export default {
  /**
   * 发送请求统一处理
   * @param method   方法
   * @param params   参数（多个参数，用数组传递，如：[参数1，参数2]）
   * @param _this    vue实例
   * @param success  回调函数
   * @param message  信息提示（为 true表示提示请求回来的提示，false表示不提示，字符串表示提示传递的信息）
   * @param fail     失败回调 (可能是自定义提示信息，可能是回调函数)
   * @param error    异常回调
   */
  request: (method, params, _this, success, message = true, fail, error) => {
    return method(params).then(res => {
      _this.jumpUrl(res, _this, data => {
        success && success(data);
        if (data.message) {
          if (message === true) return _this.success(data.message);
          if (typeof (message) === 'string') return _this.success(message);
        }
        //return (data.message||message) && _this.success(typeof(message)=='string'?message:data.message);
      }, fail);
    }).catch(err => {
      !error ? _this.error('服务异常') : (typeof (error) === 'string' ? _this.error(error) : error(err));
    });
  },

  /**
   * 表单提交统一处理
   * @param method      请求方法
   * @param form        表单对象
   * @param _this       vue实例
   * @param success     成功回调
   * @param isFormClear 是否清空表单 (添加后清空，编辑后不清空)
   * @param fail        失败回调 (可能是自定义提示信息，可能是回调函数)
   * @param error       异常回调
   */
  handleSubmit: (method, form, _this, success, isFormClear = false, fail, error) => {
    _this.loading = true;
    form.validate(valid => {
      if (!valid) {
        return _this.loading = false;
      }
	  console.log(form.model)
      method(form.model).then(res => {
        !fail && (_this.loading = false);
        _this.jumpUrl(res, _this, data => {
          isFormClear && form.resetFields();
          data.message && _this.success(data.message);
          return success && success(data);
        }, fail);
      }).catch(err => {
        _this.loading = false;
        !error ? _this.error('服务异常') : (typeof (error) === 'string' ? _this.error(error) : error(err));
      });
    });
  },
  /**
   * 下载文件统一处理
   * @param method   方法
   * @param params   参数（多个参数，用数组传递，如：[参数1，参数2]）
   * @param fileName 文件名
   * @param success  回调函数
   * @param message  信息提示（为 true表示提示请求回来的提示，false表示不提示，字符串表示提示传递的信息）
   * @param fail     失败回调 (可能是自定义提示信息，可能是回调函数)
   * @param error    异常回调
   */
  downloadFile: (method, params, fileName, _this, success, message = true, fail, error) => {
    return method(params).then(res => {
      _this.jumpUrlDownload(res, _this, data => {
        const link = document.createElement('a');
        let blob = new Blob([data], {
          type: 'application/vnd.ms-excel'
        });
        link.style.display = 'none';
        link.href = URL.createObjectURL(blob);
        //下载后文件名
        // link.download = res.headers['content-disposition']
        //下载的文件名
        link.download = fileName;
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
      }, fail);
    }).catch(err => {
      !error ? _this.error('服务异常') : (typeof (error) === 'string' ? _this.error(error) : error(err));
    });
  },
  /**
   * 页面跳转
   * @param res 请求返回的数据对象
   * @param _this vue实例
   * @param success 成功回调
   * @param error 失败回调 (可能是自定义提示信息，可能是回调函数)
   */
  jumpUrl: (res, _this, success, error) => {
    res = res.data ? res.data : res;
    if (res.code === 3) {// 无权限
      return _this.$router.push('/401');
    } else if (res.code === 200) {// 成功
      return success && success(res.data ? res.data : res);
    } else if (res.code === 201) {// 失败 (可能是自定义提示信息，可能是回调函数)
      return !error ? _this.error(res.message) : (typeof (error) === 'string' ? _this.error(error) : error(res));
    }else if (res.code === 206) {// 失败 (可能是自定义提示信息，可能是回调函数)
      return !error ? _this.error(res.message) : (typeof (error) === 'string' ? _this.error(error) : error(res));
    } else {
      _this.error(res.message, () => {
        _this.$ls.clear();
        _this.$store.dispatch('clearLoginOut');
        _this.$router.push('/login');
        setTimeout(() => window.location.reload(), 600);
      });
    }
  },
  /**
   * 下载页面跳转
   * @param res 请求返回的数据对象
   * @param _this vue实例
   * @param success 成功回调
   * @param error 失败回调 (可能是自定义提示信息，可能是回调函数)
   */
  jumpUrlDownload: (res, _this, success, error) => {
    res = res.data ? res.data : res;
    if (res.code === 3) {// 无权限
      return _this.$router.push('/401');
    } else if (res.code === 0) {// 失败 (可能是自定义提示信息，可能是回调函数)
      return !error ? _this.error(res.message) : (typeof (error) === 'string' ? _this.error(error) : error(res));
    } else {
      return success && success(res.data ? res.data : res);
    }
  },
  /**
   * 截取数组中指定的项
   * @param data
   * @param start
   * @param end
   * @returns {*}
   */
  arraySplice: (data, start, end) => {
    return Array.isArray(data) && data.slice(start, start + end);
  },
  /**
   * 删除图片
   * @param url 请求地址
   * @param path 待删除图片路径
   * @param success 删除成功回调
   * @param error 删除失败回调
   * @param type 请求类型
   */
  delUploadImage: function (url, path, success, error, type = 'post') {
    this.axios.request({
      url: url,
      method: type,
      data: {path: path}
    }).then(res => {
      if (res.data.code === 1) {
        return success && success();
      } else {
        return error && error();
      }
    });
  },
  /**
   * 格式化时间格式
   * @param val
   * @param fmt
   * @returns {string}
   */
  formatTime: function (val, fmt) {
    if (!val) {
      return "";
    }
    let date;
    if (typeof val === 'string') {
      date = new Date(Date.parse(val.replace(/-/g, '/')));
    } else if (typeof val === 'number') {
      date = new Date(val);
    } else {
      date = val;
    }
    const year = date.getFullYear();
    let month = date.getMonth() + 1;
    let month1 = date.getMonth() + 1;
    month = month > 9 ? month : ('0' + month);
    let day1 = date.getDate();
    let day = date.getDate();
    day = day > 9 ? day : ('0' + day);
    let week = date.getDay();
    let hh = date.getHours();
    hh = hh > 9 ? hh : ('0' + hh);
    let mm = date.getMinutes();
    mm = mm > 9 ? mm : ('0' + mm);
    let ss = date.getSeconds();
    ss = ss > 9 ? ss : ('0' + ss);
    if (fmt) {
      if (fmt === 1) {
        return year + '-' + month + '-' + day + ' ' + hh + ':' + mm;
      }
      if (fmt === 2) {
        return year + '-' + month + '-' + day + ' ' + hh;
      }
      if (fmt === 3) {
        return year + '-' + month + '-' + day;
      }
      if (fmt === 4) {
        return hh + ':' + mm + ':' + ss;
      }
      if (fmt === 5) {
        return month + '-' + day + ' ' + hh + ':' + mm;
      }
      if (fmt === 6) {
        if (week === 0) {
          week = "星期日";
        } else if (week === 1) {
          week = "星期一";
        } else if (week === 2) {
          week = "星期二";
        } else if (week === 3) {
          week = "星期三";
        } else if (week === 4) {
          week = "星期四";
        } else if (week === 5) {
          week = "星期五";
        } else if (week === 6) {
          week = "星期六";
        }
        return month1 + '月' + day1 + '日' + " " + week;
      }
      if (fmt === 7) {
        return day1 + '日 ' + hh + ':' + mm
      }
      if (fmt === 8) {
        return hh + ':' + mm;
      }
      if (fmt ===9){
        if(mm/30>1){
          return date.getHours()+1 +':00'
        }else{
          return hh +':30'
        }
      }
      if (fmt === 10) {
        return day1 + '日';
      }
    }
    return year + '-' + month + '-' + day + ' ' + hh + ':' + mm + ':' + ss;
  },
  /**
   * 格式化时间格式
   * @param row
   * @param column
   * @param cellValue
   * @param index
   * @returns {string}
   */
  colFmtDate: function (row, column, cellValue, index) {
    const val = row[column.property];
    if (val === null || val === undefined) {
      return "";
    }
    return val.substr(0, val.length - 3);
  },
  /**
   * 批量修改对象值
   * @param data
   * @param val
   * @constructor
   */
  objectForIn: (data, val) => {
    for (const key in data) {
      data[key] = val;
    }
  },
  /**
   * 获取 blob
   * @param  {String} url 目标文件地址
   * @return {cb} 
   */
  getBlob(url, cb, context) {
  	var xhr = new XMLHttpRequest();
  	xhr.open('GET', url, true);
  	xhr.responseType = 'blob';
  	xhr.onload = function() {
  		if (xhr.status === 200) {
  			cb(xhr.response);
  		}else if(xhr.status === 404){
			context.error('资源不存在!');
		}else{
			
		}
  	};
  	xhr.send();
  },
  
  /**
   * 保存
   * @param  {Blob} blob     
   * @param  {String} filename 想要保存的文件名称
   */
  saveAs(blob, filename) {
  	if (window.navigator.msSaveOrOpenBlob) {
  		navigator.msSaveBlob(blob, filename);
  	} else {
  		var link = document.createElement('a');
  		var body = document.querySelector('body');
  
  		link.href = window.URL.createObjectURL(blob);
  		link.download = filename;
  
  		// fix Firefox
  		link.style.display = 'none';
  		body.appendChild(link);
  		link.click();
  		body.removeChild(link);
  
  		window.URL.revokeObjectURL(link.href);
  	};
  },
  
  /**
   * 下载
   * @param  {String} url 目标文件地址
   * @param  {String} filename 想要保存的文件名称
   */
  download(url, filename, context) {
  	const that = this
  	this.getBlob(url, function(blob) {
  		that.saveAs(blob, filename);
  	},context);
  }
}